package designpattern.create.single;

/**
 * Created by cuihao on 2017/10/23.
 * 懒汉升级->双重锁机制    线程安全 性能低
 */

public class DoubleCheck {
    private static volatile DoubleCheck doubleCheck;

    private DoubleCheck() {
    }

    public static DoubleCheck getInstance() {
        if (doubleCheck == null) {
            // Thread A; Thread B
            synchronized (DoubleCheck.class) {
                if (doubleCheck == null) {
                    doubleCheck = new DoubleCheck();
                }
            }
        }
        return doubleCheck;
    }
}


// 第一次检查是判断如果已经实例化了，就没有必要再加锁了，直接返回对象就行。
// 第二次检查是两个线程同时过了第一关第一个==null这个条件，两个线程会先后获取锁创建对象，所以在内部再判断一次
// 为什么volatile？一个线程进来走到构造方法这个，先赋值再初始化，如果在赋完值还没初始化的时候，另一个线程调用getInstance方法发现已经不是null了(判断是否为null不需要锁)，就会返回一个没有初始化完全的对象
